function DynamicLoad(){
    //属性
    var Self = this; //对象自身
    //功能：加载指定的文件
    //参数：src——需要被加载的文件
    //返回：（无）
    this.Load = function(src){
        if (Self.IsLoaded(src)) //判断该文件是否已经加载了
        {
            Self.OnLoaded(src);
            return;
        }
        else //如果没有加载，动态创建
        {
            var objDynamic; //动态创建的对象
            var type = Self.GetSrcType(src); //文件类型
            if (type == "js" || type == "vbs") {
                objDynamic = document.createElement("script");
                objDynamic.src = src;
                if (type == "js") {
                    objDynamic.type = "text/javascript";
                    objDynamic.language = "javascript";
                }
                else {
                    objDynamic.type = "text/vbscript";
                    objDynamic.language = "vbscript";
                }
            }
            else 
                if (type == "css") {
                    objDynamic = document.createElement("link");
                    objDynamic.rel = "stylesheet";
                    objDynamic.type = "text/css";
                    objDynamic.href = src;
                }
                else {
                    Self.OnFailed(src);
                    return;
                }
            document.getElementsByTagName("head")[0].appendChild(objDynamic); //将创建的对象插入到HEAD节中
            objDynamic.onload = objDynamic.onreadystatechange = function() //加载过程中状态改变引发的事件
            {
                //在此函数中this指针指的是s结点对象，而不是JsLoader实例，   
                //所以必须用self来调用onsuccess事件，下同。
                if (this.readyState && this.readyState == "loading") 
                    return;
                else 
                    Self.OnLoaded(src);
            };
            objDynamic.onerror = function() //加载过程中发生错误引发的事件
            {
                document.getElementsByTagName("head")[0].removeChild(objDynamic);
                Self.OnFailed(src);
            };
        }
    };
    
    //功能：判断是否已经加载了某文件
    //参数：src——需要被检查的文件
    //返回：返回是否已经加载了该文件
    this.IsLoaded = function(src){
        var isLoaded = false; //假设没有加载
        var type = Self.GetSrcType(src); //得到文件的类型
        var i; //用于循环的索引
        if (type == "js" || type == "vbs") {
            var scripts = document.getElementsByTagName("script"); //得到所有的脚本对象集合
            for (i = 0; i < scripts.length; i++) //依次判断每个script对象
            {
                if (scripts[i].src && scripts[i].src.indexOf(src) != -1) {
                    if (scripts[i].readyState == "loaded" || scripts[i].readyState == "complete") {
                        isLoaded = true;
                        break;
                    }
                }
            }
        }
        else 
            if (type == "css") {
                var links = document.getElementsByTagName("link"); //得到所有的link对象集合
                for (i = 0; i < links.length; i++) //依次判断每个link对象
                {
                    if (links[i].href && links[i].href.indexOf(src) != -1) {
                        if (links[i].readyState == "loaded" || links[i].readyState == "complete" || links[i].readyState == "interactive") {
                            isLoaded = true;
                            break;
                        }
                    }
                }
            }
        return isLoaded;
    };
    
    //功能：得到文件的类型（即扩展名）
    //参数：src——文件名
    //返回：返回文件的类型
    this.GetSrcType = function(src){
        var type = "";
        var lastIndex = src.lastIndexOf(".");
        if (lastIndex != -1) {
            type = src.substr(lastIndex + 1);
        }
        return type;
    };
    
    //功能：当文件加载完成时发生的事件
    //参数：src——加载完成的文件
    //返回：（无）
    this.OnLoaded = function(src){
        Self.LoadedCallback(src);
    };
    
    //功能：文件加载完成时执行的回调函数
    //参数：src——加载完的文件
    //返回：（无）
    this.LoadedCallback = function(src){
    };
    
    //功能：当文件加载过程中发生错误时发生的事件
    //参数：src——正在加载的文件
    //返回：（无）
    this.OnFailed = function(src){
        Self.FailedCallback(src);
    };
    
    //功能：当文件加载失败时执行的回调函数
    //参数：src——加载失败的文件
    //返回：（无）
    this.FailedCallback = function(src){
    };
}
